/**
 * 编写一个函数，其作用是将输入的字符串反转过来。
 * 输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间，
 * 你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
 * @param {*} str 
 * @returns 
 */
function reverseString(arr) {
    let strlen = arr.length;
    let left = 0;
    let right = strlen - 1;
    // for (let i = 0; i <= parseInt(strlen / 2); i++) {
    //     let j = strlen - i - 1;
    //     let tmp = arr[i];
    //     arr[i] = arr[j];
    //     arr[j] = tmp;
    // }
    while (left < right) {
        let tmp = arr[left];
        arr[left] = arr[right];
        arr[right] = tmp;
        left++;
        right--;
    }
    return arr.join("");
}

console.log("[字符串反转]", reverseString("yu0j0i".split("")));

/**
 * 给定一个字符串 s 和一个整数 k，从字符串开头算起，每计数至 2k 个字符，
 * 就反转这 2k 字符中的前 k 个字符。
 * 1. 如果剩余字符少于 k 个，则将剩余字符全部反转.
 * 2. 如果剩余字符小于 2k 但大于或等于 k 个，则反转前 k 个字符，其余字符保持原样。
 * @param {*} arr 
 * @param {*} k 
 */
function reverseStrByNum(arr, k) {
    let strlen = arr.length;
    // let tlen = 1;
    let reverseGo = function (arr, left, right) {
        // let strlen = (right - left) + 1;
        console.log(arr.slice(left, right + 1))
        // for (let i = left; i <= right; i++) {
        while (left < right) {
            let tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            left++;
            right--;
        }

        // console.log(arr[i]);
        // let j = strlen - i - 1;
        // let tmp = arr[left + i];
        // arr[left + i] = arr[right - j];
        // arr[right - j] = tmp;
        // }
        // console.log(strlen);
        // return arr.join("");
    }
    for (let i = 0; i < strlen; i += 2 * k) {
        // 如果出现i+k小于数组长度，那么前面k个字符可以继续反转
        if (i + k < strlen) {
            reverseGo(arr, i, i + k - 1);
            continue;
        } else {
            reverseGo(arr, i, strlen - 1);
        }
    }

    // for (let i = 0; i < strlen; i++) {
    //     // 字符串长度大于2k情况
    //     // abd cd3 sye kn
    //     // dba cdy s3e kn
    //     // cdbadeys3kn
    //        dba cd3 eys kn
    //     if (tlen === 2 * k) {
    //         reverseGo(arr, i - tlen + 1, i - k);
    //         tlen = 1;
    //         continue
    //     }
    //     // 如果剩余字符串长度在(k, 2*k], 6-5
    //     if (tlen < 2 * k && tlen >= k && i === strlen - 1) {
    //         console.log("[sdsdfsdf]", i, tlen)
    //         reverseGo(arr, i - tlen + 1, i - (2 * k - tlen + 1));
    //     }
    //     // 如果剩余字符串长度在(0, k)区间下,
    //     if (tlen < k && tlen > 0 && i === strlen - 1) {
    //         reverseGo(arr, i - tlen + 1, i);
    //     }
    //     tlen++;
    // }
    return arr.join("");
}

console.log("[k个字符串反转]", reverseStrByNum("abdcd3syekn".split(""), 3))